/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.

This file is part of Quake III Arena source code.

Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Quake III Arena source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/
// cmdlib.h

#ifndef __CMDLIB__
#define __CMDLIB__

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4244) // MIPS
#pragma warning(disable : 4136) // X86
#pragma warning(disable : 4051) // ALPHA

#pragma warning(disable : 4018) // signed/unsigned mismatch
#pragma warning(disable : 4305) // truncate from double to float

#pragma check_stack(off)

#endif

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <time.h>
#include <stdarg.h>

#ifdef _MSC_VER

#pragma intrinsic(memset, memcpy)

#endif

#ifndef __BYTEBOOL__
#define __BYTEBOOL__
typedef enum { qfalse, qtrue } qboolean;
typedef unsigned char byte;
#endif

#define MAX_OS_PATH 1024
#define MEM_BLOCKSIZE 4096

// the dec offsetof macro doesn't work very well...
#define myoffsetof(type, identifier) ((size_t) & ((type*)0)->identifier)

// set these before calling CheckParm
extern int    myargc;
extern char** myargv;

char* strupr(char* in);
char* strlower(char* in);
int Q_strncasecmp(const char* s1, const char* s2, int n);
int Q_stricmp(const char* s1, const char* s2);
void Q_getwd(char* out);

int Q_filelength(FILE* f);
int FileTime(const char* path);

void Q_mkdir(const char* path);

extern char qdir[1024];
extern char gamedir[1024];
extern char writedir[1024];
void SetQdirFromPath(const char* path);
char* ExpandArg(const char* path);  // from cmd line
char* ExpandPath(const char* path); // from scripts
char* ExpandGamePath(const char* path);
char* ExpandPathAndArchive(const char* path);

double I_FloatTime(void);

void Error(const char* error, ...);
int CheckParm(const char* check);

FILE* SafeOpenWrite(const char* filename);
FILE* SafeOpenRead(const char* filename);
void SafeRead(FILE* f, void* buffer, int count);
void SafeWrite(FILE* f, const void* buffer, int count);

int LoadFile(const char* filename, void** bufferptr);
int LoadFileBlock(const char* filename, void** bufferptr);
int TryLoadFile(const char* filename, void** bufferptr);
void SaveFile(const char* filename, const void* buffer, int count);
qboolean FileExists(const char* filename);

void DefaultExtension(char* path, const char* extension);
void DefaultPath(char* path, const char* basepath);
void StripFilename(char* path);
void StripExtension(char* path);

void ExtractFilePath(const char* path, char* dest);
void ExtractFileBase(const char* path, char* dest);
void ExtractFileExtension(const char* path, char* dest);

int ParseNum(const char* str);

char* COM_Parse(char* data);

extern char     com_token[1024];
extern qboolean com_eof;

char* copystring(const char* s);

void CRC_Init(unsigned short* crcvalue);
void CRC_ProcessByte(unsigned short* crcvalue, byte data);
unsigned short CRC_Value(unsigned short crcvalue);

void CreatePath(const char* path);
void QCopyFile(const char* from, const char* to);

extern qboolean archive;
extern char     archivedir[1024];

extern qboolean verbose;
void qprintf(const char* format, ...);
void _printf(const char* format, ...);

void ExpandWildcards(int* argc, char*** argv);

// for compression routines
typedef struct
{
    void* data;
    int   count, width, height;
} cblock_t;

#endif
